package br.com.unioConci.consulta.negocio;

import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.hibernate.Criteria;
import org.hibernate.Session;

import br.com.r2.util.hibernate.business.R2HbNgc;
import br.com.r2.util.tipodado.Data;
import br.com.r2.util.tipodado.Flag;
import br.com.r2.util.tipodado.Texto;
import br.com.r2.util.tipodado.YesNo;
import br.com.unioConci.upload.negocio.ArquivoFinanceiroAnaliticoNgc;
import br.com.unioConci.upload.negocio.ArquivoRazaoAnaliticoNgc;
import br.com.unioConci.upload.vo.ArquivoFinanceiroAnaliticoVo;
import br.com.unioConci.upload.vo.ArquivoRazaoAnaliticoVo;
import br.com.unioConci.upload.vo.filtro.FiltroArquivoVo;

public class ConsultaConciliacaoAnaliticoNgc extends R2HbNgc<ArquivoFinanceiroAnaliticoVo>
{

   private static ConsultaConciliacaoAnaliticoNgc instancia = null;

   public static ConsultaConciliacaoAnaliticoNgc getInstancia()
   {
      if (instancia == null)
      {
         instancia = new ConsultaConciliacaoAnaliticoNgc();
      }
      return instancia;
   }

   
   @Override
   public List<ArquivoFinanceiroAnaliticoVo> pesquisar(Session session, ArquivoFinanceiroAnaliticoVo filter, int join) throws Exception
   {
      List<ArquivoFinanceiroAnaliticoVo> retorno = null;
      
      filter.setSituacao(new Flag(YesNo.YES));
      retorno = ArquivoFinanceiroAnaliticoNgc.getInstancia().pesquisar(session, filter, join);
      
      if (retorno != null && retorno.size() > 0)
      {
         ArquivoRazaoAnaliticoVo filtroRazaoVo = new ArquivoRazaoAnaliticoVo();
         filtroRazaoVo.setFiltro(new FiltroArquivoVo());

         // situacao 
         filtroRazaoVo.setSituacao(new Flag(YesNo.YES));
         
         Iterator<ArquivoFinanceiroAnaliticoVo> iterator = retorno.iterator();
         while (iterator.hasNext())
         {
            ArquivoFinanceiroAnaliticoVo element = (ArquivoFinanceiroAnaliticoVo) iterator.next();
            // pegando o primeiro dia do mes da data baixa passada como filtro de pesquisa
            Data data = element.getDataBaixa();
            Calendar calendarNovo = new GregorianCalendar();
            Calendar calendar = new GregorianCalendar();
            calendar.set(data.getAno().getValor(), data.getMes().getValor(), data.getDiaMes().getValor());
            int actualMinimum = calendar.getActualMinimum(Calendar.DAY_OF_MONTH);
            calendarNovo.set(data.getAno().getValor(), data.getMes().getValor(), actualMinimum);
            filtroRazaoVo.getFiltro().setDataBaixaInicial(new Data(calendarNovo.getTime()));
            
            // pegando o ultimo dia do mes da data baixa passada como filtro de pesquisa
            int actualMaximum = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
            calendarNovo.set(data.getAno().getValor(), data.getMes().getValor(), actualMaximum);

            // setando o codigo do cliente para pesquisar no historico do razao
            filtroRazaoVo.getFiltro().setDataBaixaFinal(new Data(calendarNovo.getTime()));
            
            filtroRazaoVo.setHistorico(new Texto(element.getCodigoCliente().toString()));
            
            List<ArquivoRazaoAnaliticoVo> listaRazaoElement = ArquivoRazaoAnaliticoNgc.getInstancia().pesquisar(session, filtroRazaoVo, 0);
            
            if (listaRazaoElement != null && listaRazaoElement.size() > 0)
            {
               element.setListaRazaoAnalitico(listaRazaoElement);
            }
            element.setExibirListaRazao(false);
         }
      }
      
      return retorno;
   }

   @Override
   protected Map filtroPropriedade()
   {
      // TODO Auto-generated method stub
      return null;
   }

   @Override
   protected Criteria montaCriteria(Session session, int join)
   {
      // TODO Auto-generated method stub
      return null;
   }

   @Override
   protected Map restritores()
   {
      // TODO Auto-generated method stub
      return null;
   }

}
